
#ifndef __TFTP_EXCEPTION_HPP__
#define __TFTP_EXCEPTION_HPP__

////////////////////////////////////////////////////////////////////////////////

#include "exception.hpp"
#include "tftp-packet.hpp"

#include <stdexcept>
#include <stdint.h>
#include <stdlib.h>

////////////////////////////////////////////////////////////////////////////////

class tftp_packet;
class tftp_packet_error;

////////////////////////////////////////////////////////////////////////////////

class tftp_exception : public std::exception
{
public:
    tftp_exception(const char* msg);
    virtual const char* what() const throw();

protected:
    const char* msg;
};

////////////////////////////////////////////////////////////////////////////////

class tftp_exception_malformed : public tftp_exception
{
public:
    tftp_exception_malformed();
};

////////////////////////////////////////////////////////////////////////////////

class tftp_exception_mode : public tftp_exception
{
public:
    tftp_exception_mode();
};

////////////////////////////////////////////////////////////////////////////////

class tftp_exception_sn : public tftp_exception
{
public:
    tftp_exception_sn();
};

////////////////////////////////////////////////////////////////////////////////

class tftp_exception_error : public tftp_exception
{
public:
    tftp_exception_error(const tftp_packet_error e);
};

////////////////////////////////////////////////////////////////////////////////

class tftp_exception_opcode : public tftp_exception
{
public:
    tftp_exception_opcode(const tftp_packet* packet, const char* msg);
};

////////////////////////////////////////////////////////////////////////////////

#endif
